package handler

import (
	"context"
	"errors"
	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/protocol/consts"
	"github.com/jinzhu/copier"
	"strconv"
	"view-crawler-backend/internal/biz_error"
	"view-crawler-backend/internal/constant"
	"view-crawler-backend/internal/dao/entity"
	"view-crawler-backend/internal/dto/req"
	"view-crawler-backend/internal/dto/resp"
	"view-crawler-backend/internal/service"
)

func CreateTask(_ context.Context, c *app.RequestContext) {
	taskCreateReq := req.TaskUpdateReq{}
	task := entity.Task{}
	if c.BindAndValidate(&taskCreateReq) != nil || copier.Copy(&task, &taskCreateReq) != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}

	taskId, err := service.CreateTask(&task, taskCreateReq.CategoryList)
	if err != nil {
		if errors.Is(err, biz_error.TaskNameUsedError) {
			c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.TASK_NAME_USED_ERROR))
		} else {
			c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
		}
	} else {
		c.JSON(consts.StatusOK, resp.BuildSuccessResponse(taskId))
	}
}

func UpdateTask(_ context.Context, c *app.RequestContext) {
	taskUpdateReq := req.TaskUpdateReq{}
	task := entity.Task{}
	if c.BindAndValidate(&taskUpdateReq) != nil || copier.Copy(&task, &taskUpdateReq) != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}

	if service.UpdateTask(&task) != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
	} else {
		c.JSON(consts.StatusOK, resp.BuildSuccessResponse(nil))
	}
}

func UpdateTaskDefine(_ context.Context, c *app.RequestContext) {
	taskId, err := strconv.ParseInt(c.Query("taskId"), 10, 64)
	if err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}
	// 任务定义以Text形式存在于body中
	taskDefineBytes, err := c.Body()
	if err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
	}
	if err := service.UpdateTaskDefine(taskId, taskDefineBytes); err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
	} else {
		c.JSON(consts.StatusOK, resp.BuildSuccessResponse(nil))
	}

}

func DeleteTask(_ context.Context, c *app.RequestContext) {
	taskId, err := strconv.ParseInt(c.Query("taskId"), 10, 64)
	if err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}
	if service.DeleteTask(taskId) != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
	} else {
		c.JSON(consts.StatusOK, resp.BuildSuccessResponse(nil))
	}
}

// QueryTaskList 分页查询任务列表
func QueryTaskList(_ context.Context, c *app.RequestContext) {
	taskPaginationReq := req.TaskPaginationReq{}
	if c.BindAndValidate(&taskPaginationReq) != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}
	tasks, total, err := service.QueryTaskList(taskPaginationReq.Page, taskPaginationReq.PageSize)
	if err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
	}
	c.JSON(consts.StatusOK, resp.BuildSuccessResponse(&resp.TaskPaginationResp{
		Total:    int(total),
		DataList: tasks,
	}))
}

// QueryTaskDetail 查询任务详情
func QueryTaskDetail(_ context.Context, c *app.RequestContext) {
	taskId, err := strconv.ParseInt(c.Query("taskId"), 10, 64)
	if err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.INVALID_PARAM))
		return
	}
	if taskDetail, err := service.QueryTaskDetail(taskId); err != nil {
		c.JSON(consts.StatusOK, resp.BuildErrorResponse(constant.DATABASE_OPERATE_ERROR))
	} else {
		c.JSON(consts.StatusOK, resp.BuildSuccessResponse(taskDetail))
	}
}
